package com.app.listen;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.app.bean.dto.User;
import com.app.common.RabbitConst;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

import static com.app.common.RabbitConst.QUEUE_NAME;

/**
 * 监听器
 *
 * @author xiaoyu.fang
 * @date 2019/12/13 15:13
 */
@Slf4j
@Configuration
@RabbitListener(queues = RabbitConst.QUEUE_NAME)
public class BizTopicListen {

    @RabbitHandler
    public void getTopicMsg(String msg, Message message, Channel channel) {
        long tag = message.getMessageProperties().getDeliveryTag();
        try {
            // TODO something 判断msg
            JSONObject userJson = JSONObject.parseObject(msg);
            User user = JSON.toJavaObject(userJson, User.class);
            log.info("消息 >>>>>>>>>>>>>>>>>>>>>>> {}", user.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // Confirm 模式，手动确认消息
                // basicAck 方法的第二个参数 multiple 取值为 false 时，表示消息已确认；
                // 如果为 true，将比第一个参数指定的delivery tag 小的消息一并确认。
                channel.basicAck(tag, false);
                // 是否重复消费消息
                // 第三个参数 requeue 设置为true，会把消息从新添加到队列的尾部，设置为false不会重回到队列
                // channel.basicNack(tag, false, true);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
